//! Zenop2p 核心网络行为：整合 libp2p 组件与 zenoh 流支持
use libp2p::swarm::NetworkBehaviour;
use libp2p::{
    autonat::Behaviour as Autonat,                   // NAT 穿透与公网地址检测
    identity::PeerId,
    kad::{Behaviour as Kademlia, store::MemoryStore}, // 节点发现（含引导）
    mdns::{tokio::Behaviour as Mdns, Config as MdnsConfig}, // 局域网发现（使用tokio运行时）
    request_response::{cbor::Behaviour as RequestResponse, Config as RequestResponseConfig, ProtocolSupport}, // Zenop2p 流协议（使用CBOR编解码器）
    StreamProtocol,
};




/// Zenop2p 网络行为：整合所有必要的 libp2p 功能
#[derive(NetworkBehaviour)]
pub struct Zenop2pBehaviour {
    pub kad: Kademlia<MemoryStore>,  // Kademlia 分布式发现
    pub mdns: Mdns,                  // 局域网节点发现
    pub autonat: Autonat,            // NAT 穿透与公网地址检测
    pub zenop2p_stream: RequestResponse<Vec<u8>, Vec<u8>>,  // Zenop2p 专用流（使用字节数组作为请求/响应）
}

impl Zenop2pBehaviour {
    /// 创建新的 Zenop2pBehaviour 实例
    pub fn new(local_peer_id: PeerId) -> Result<Self, Box<dyn std::error::Error>> {
        // 创建 Kademlia 存储
        let store = MemoryStore::new(local_peer_id);
        
        // 创建 Kademlia 行为
        let kad = Kademlia::new(local_peer_id, store);
        
        // 创建 mDNS 行为
        let mdns = Mdns::new(MdnsConfig::default(), local_peer_id)?;
        
        // 创建 AutoNAT 行为
        let autonat = Autonat::new(local_peer_id, Default::default());
        
        // 创建 Zenop2p 流协议配置
        let zenop2p_protocol = StreamProtocol::new("/zenop2p/1.0.0");
        
        // 创建 RequestResponse 行为（使用CBOR编解码器）
        let zenop2p_stream = RequestResponse::new(
            std::iter::once((zenop2p_protocol, ProtocolSupport::Full)),
            RequestResponseConfig::default(),
        );
        
        Ok(Self {
            kad,
            mdns,
            autonat,
            zenop2p_stream,
        })
    }
}
